package stereoJavaconfig.soundsystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author XiaoDongLei
 * @Package com.vonzhou.springinaction.knights
 * @date 2018/3/24
 * @Description: 通过Java代码装配bean
 * <p>
 * 1、@Configuration注解：@Configuration注解表明这个类是一个配置类，该类应该包含在Spring应用上下文中如何创建bean的细节。
 * 1.1、有@Configuration注解的类，而在XML配置中，这意味着要创建一个XML文件，并且要以<beans>元素为根。
 * <p>
 * 2、声明简单的bean
 * 2.1、@Bean注解会告诉Spring这个方法将会返回一个对象，该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。默认情况下，bean的ID与带有@Bean注解的方法名是一样的。
 *
 * 在本例中，bean的名字将会是默认情况下，在本例中，bean的名字将会是compactDisc。
 * <p>
 * 在JavaConfig中装配bean的最简单方式就是引用创建bean的方法。
 * 再次强调一遍，带有@Bean注解的方法可以采用任何必要的Java功能来产生bean实例。
 */
@Configuration
public class CDPlayerConfig {

	@Bean
	public CompactDisc compactDisc() {
		return new SgtPeppers();
	}

//	@Bean
//	public CDPlayer cdPlayer(CompactDisc compactDisc) {
//		return new CDPlayer(compactDisc);
//	}

	@Bean
	public CDPlayer cdPlayer1() {
		/**
		 * 因为sgtPeppers()方法上添加了@Bean注解，Spring将会拦截所有对它的调用，并确保直接返回该方法所创建的bean，而不是每次都对其进行实际的调用。
		 *
		 * 看起来，CompactDisc是通过调用sgtPeppers()得到的，但情况并非完全如此。因为sgtPeppers()方法上添加了@Bean注解，Spring将会拦截所有对它的调用，并确保直接返回该方法所创建的bean，而不是每次都对其进行实际的调用。
		 * 默认情况下，Spring中的bean都是单例的，我们并没有必要为第二个CDPlayer bean创建完全相同的SgtPeppers实例
		 */
		return new CDPlayer(compactDisc());
	}

}
